import UIKit
//类和结构体共同点：1.定义属性用于存储值2.定义方法用于提供功能3.定义附属脚本用于访问值4.定义构造器用于初始化值5.通过扩展以增加默认实现的功能6.符合协议以对某类提供标准功能
//与结构体相比，类有如下附加功能:1.允许继承2.类型检查允许在运行检查一个类实例的类型3.解析器允许一个类实例释放任何其所被分配的资源4.引用计数允许对一个类多次引用。

//定义
class SomeClass {}
struct SomeStruct {}

struct Resolution {
    var width = 0
    var height = 0
}

class VideModel {
    var resolution = Resolution()
    var interlaced = false
    var framRate = 0.0
    var name: String?
}

//实例 通过构造器来生成新的实例。最简单的构造器语法是在结构体或类名称后跟随一个空括弧，此时属性会被初始化为默认值。
let someResolution = Resolution()
let someVideModel = VideModel()
//属性访问 通过点语法
someVideModel.resolution.height = 100 //直接设置resolution结构体的属性height是可以的

//结构体类型的成员逐一构造器,注意：类没有默认的成员逐一构造器
let vga = Resolution(width: 1, height: 2)
//结构体和枚举是值类型，值类型意思是常量，变量或本身被传递给函数的时候，实际上操作的是其拷贝（完全不同的对象）
let hd = Resolution(width: 1920, height: 1080)
var cinema = hd
cinema.width = 2048 //对cinema的width属性值进行修改不会影响之前的hd的width属性值。
print("cinema.width is now:\(cinema.width), but hd.width is also \(hd.width)")
//类是引用类型 与值类型不同的是，引用类型在被赋予到一个常量，变量或者被传递到一个函数时，操作的是引用，并不是拷贝。
let tenEighty = VideModel()
tenEighty.resolution = hd
tenEighty.interlaced = true
tenEighty.name = "1080i"
tenEighty.framRate = 25.0

let alsoTenEighty = tenEighty
alsoTenEighty.framRate = 30.0

print("tenEighty framRate is \(tenEighty.framRate)") //tenEighty framRate is 30.0说明，tenEighty和alsoTenEighty是引用相同的VideoModel的实例。
//恒等运算符 === 等价于 !== 不等于
//为什么提出恒等运算符？为了判断两个常量或变量是否引用同一个类的实例。
if (tenEighty === alsoTenEighty) {
    print("tenEighty and alsoTenEighty refer to be same resolution instance.")
}


